package com.v5.java.proxy.demo01;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * java 动态代理测试类
 *
 */
public class MyMain {

	public static void main(String[] args) {
		// 使用真正的对象调用
		//创建真正的对象
		final MyService obj = new MyServiceImpl();
//		obj.method1();
		
		
		// =============================
		// 动态代理
		
		//生成obj真正对象的代理对象
		/*
		 * Object Proxy.newProxyInstance(ClassLoader loader, 类加载器，使用当前类的加载器
                                      Class<?>[] interfaces, 真正对象实现的接口
                                      InvocationHandler h) 如何在代理对象中处理客户端调用
                                      
                             需求：重写method1实现

		 */
		MyService proxy = (MyService) Proxy.newProxyInstance(MyMain.class.getClassLoader(), 
				obj.getClass().getInterfaces(), 
				new InvocationHandler() {

					/**
					 * proxy
					 * method
					 * args 传参
					 */
					@Override
					public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
						if (method.getName().equals("method1")) {
							// 调用了method1
							System.out.println("******* in proxy: method1********");
							return null;
						} else {
							// 调用了其他方法，直接通过真正的对象去完成 
							return method.invoke(obj, args);
						}
					}
			
		});
		
		// 通过代理对象去调用业务方法
		proxy.method1();
		proxy.method2();
	}

}
